package core;
//
//import static org.junit.Assert.*;
//
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileNotFoundException;
//import java.io.IOException;
//
//import java.security.MessageDigest;
//import java.security.NoSuchAlgorithmException;
//import java.security.PrivateKey;
//import java.security.PublicKey;
//import java.util.List;
//
//import org.junit.Test;
//
public class UtilTest {
//	private static final String privkey_fname = "keys/publicador-private.key";
//	private static final String publkey_fname = "keys/publicador-public.key";
//	private static final String tests_path = "tests_images/";
//	private static final String publishers_path = "tests_publisher/";
//	
//	/*
//	 * Private functions for testing. 
//	 */
//	
//	/**
//	 * Function that delete the file referenced by path. If it is a directory
//	 * anything inside it will be also deleted, including another directories.
//	 * 
//	 * @param path: The path to the file to delete.
//	 * @throws Exception 
//	 */
//	private boolean deleteFile(String path) throws Exception {
//		String checked_path = Util.checkDirectoryPath(path);
//		File fd = new File(checked_path);
//		boolean result = true;
//
//		if (fd.isDirectory()) {
//			for (String file: fd.list())
//				result = result && deleteFile(checked_path + file);
//			return result && fd.delete();
//		}
//		else
//			return fd.delete();
//	}
//	
//	/*
//	 * Tests methods.
//	 */
//	
//	@Test
//	public void testByteArray2HexStr() {
//		// Estos son los valores en hexadecimal de la cadena "Esto es una
//		// prueba".
//		String result = "4573746f20657320756e61207072756562612e";
//		String before_str = "Esto es una prueba.";
//		byte[] before_bytearray = before_str.getBytes();
//		String after_str = Util.byteArray2HexStr(before_bytearray);
//		
//		// Caso correcto, los dos byte arrays son iguales.
//		try {
//			assertArrayEquals(result.toCharArray(), after_str.toCharArray());
//		}
//		catch (Exception e) {
//			fail("No se debería haber lanzado una excepción");
//		}
//	}
//
//	@Test
//	public void testGetHTML() throws NoSuchAlgorithmException {
//		try{
//			String xmlcode = new String(Util.getHTML("http://www.informatica64.com/dust/elladodelmal.xml"));
//			// El hash que deberia dar al hacerlo al xmlcode
//			//26c919ed867b6bf318417cfae4cfb9e45b323047
//			String hashcorrecto = "26c919ed867b6bf318417cfae4cfb9e45b323047";
//			byte[] buffer = xmlcode.getBytes();
//	        MessageDigest md = MessageDigest.getInstance("SHA1");
//	        md.update(buffer);
//	        byte[] digest = md.digest();
//	        //System.out.println(Util.byteArray2HexStr(digest)+" "+hashcorrecto);
//	        assertArrayEquals(Util.byteArray2HexStr(digest).toCharArray(),hashcorrecto.toCharArray());
//		}catch(Exception e){
//			fail("Oh my god!");
//		}
//	}
//
//	@Test
//	public void testRecoverDatafromInputStream()
//	throws IOException {
//		FileInputStream fis;
//		String result = "Este es el contenido del fichero.";
//		String fname = "tests_util/test_recoverdatafrominputstream.txt";
//		byte[] data_readed;
//		
//		fis = new FileInputStream(fname);
//		data_readed = Util.recoverDatafromInputStream(fis, -1);
//		
//		// Caso correcto, ambos byte arrays contienen la misma información.
//		try {
//			assertArrayEquals(data_readed, result.getBytes());
//		}
//		catch (Exception e) {
//			fail("No debería haberse lanzado una excepción.");
//		}
//	}
//
//	@Test
//	/*
//	 * FIRMAMOS Y REZAMOS PARA QUE NO DE EXCEPCION NI NADA RARO XD
//	 * */
//	public void testSignData() {
//		// Caso correcto, el fichero existe
//		try{
//			byte[] sign;
//			PrivateKey priv_key;
//			
//			priv_key = KeyUtils.recoverPrivateKey(privkey_fname);
//			sign = Util.signData(tests_path+"RootedLabs.jpg", priv_key);
//			if(!(sign.length>0)){
//				fail("Epic fail");
//			}
//		}catch(Exception e){
//			fail("Epic fail!");
//		}
//		// Caso erroneo, el fichero no existe
//		try{
//			byte[] sign;
//			PrivateKey priv_key;
//			
//			priv_key = KeyUtils.recoverPrivateKey(privkey_fname);
//			sign = Util.signData(tests_path+"I'mcharginmahlazeeerrr!!.omg", priv_key);
//			fail("Deberia lanzar excepcion");
//			
//			// Para que el compilador no llore.
//			sign[0] = sign[1];
//		}catch(Exception e){
//			;
//		}
//	}
//
//	@Test
//	public void testVeryfySign() {
//		// Caso correcto
//		try{
//			byte[] sign;
//			PublicKey pub_key;
//			PrivateKey priv_key;
//			
//			pub_key = KeyUtils.recoverPublicKey(publkey_fname);
//			priv_key = KeyUtils.recoverPrivateKey(privkey_fname);
//			sign = Util.signData(tests_path+"RootedLabs.jpg", priv_key);
//			if(!(sign.length>0)){
//				fail("Epic fail");
//			}
//			else{
//				byte[] data;
//				File fichero = new File(tests_path+"RootedLabs.jpg");
//				FileInputStream fis = new FileInputStream(fichero);
//				data = Util.recoverDatafromInputStream(fis, (int)fichero.length());
//				if(!(Util.verifySign(data, sign, pub_key))){
//					fail("Error al verificar firma");
//				}
//			}	
//		}catch(Exception e){
//			fail("Epic fail again!");
//		}
//		
//		// Caso incorrecto, no existe el fichero
//		try{
//			byte[] sign;
//			PublicKey pub_key;
//			PrivateKey priv_key;
//			
//			pub_key = KeyUtils.recoverPublicKey(publkey_fname);
//			priv_key = KeyUtils.recoverPrivateKey(privkey_fname);
//			sign = Util.signData(tests_path+"RootedLabs.jpg", priv_key);
//			if(!(sign.length>0)){
//				fail("Epic fail");
//			}
//			else{
//				byte[] data;
//				File fichero = new File(tests_path+"I'mcharginmahlazeeerrr!!.omg");
//				FileInputStream fis = new FileInputStream(fichero);
//				data = Util.recoverDatafromInputStream(fis, (int)fichero.length());
//				if(!(Util.verifySign(data, sign, pub_key))){
//					fail("Error al verificar firma");
//				}
//			}	
//		}catch(Exception e){
//			;
//		}
//		
//	}
//
//	@Test
//	public void testAddSign() {
//		// Caso correcto
//		try{
//			byte[] sign;
//			PublicKey pub_key;
//			PrivateKey priv_key;
//			
//			pub_key = KeyUtils.recoverPublicKey(publkey_fname);
//			priv_key = KeyUtils.recoverPrivateKey(privkey_fname);
//			sign = Util.signData(tests_path+"RootedLabs.jpg", priv_key);
//			if(!(sign.length>0)){
//				fail("Epic fail");
//			}
//			else{
//				byte[] data;
//				File fichero = new File(tests_path+"RootedLabs.jpg");
//				FileInputStream fis = new FileInputStream(fichero);
//				data = Util.recoverDatafromInputStream(fis, (int)fichero.length());
//				if(!(Util.verifySign(data, sign, pub_key))){
//					fail("Error al verificar firma");
//				}
//				// Anida que te ani-i-i-d-a-a-a
//				else{
//					Util.addSign(tests_path+"RootedLabs.jpg", sign);
//					// Hay que volver a dejar la imagen dedusterizada
//					Util.deDusterize(tests_path+"RootedLabs.jpg.dust", tests_path, pub_key);
//				}
//			}	
//		}catch(Exception e){
//			fail("Epic fail again!");
//		}
//		
//		// Caso incorrecto el fichero no existe
//		try{
//			byte[] sign;
//			PrivateKey priv_key;
//			
//			priv_key = KeyUtils.recoverPrivateKey(privkey_fname);
//			sign = Util.signData(tests_path+"RootedLabs.jpg", priv_key);
//			if(sign.length>0){
//				Util.addSign(tests_path+"RooasdsdtedLabs0000.jpg", sign);
//				fail("No deberia dar error");
//			}
//		}catch(Exception e){
//			;
//		}
//	}
//	
//	@Test
//	public void testDusterize() {
//		// Caso correcto
//		try{
//			PublicKey pub_key;
//			PrivateKey priv_key;
//			
//			pub_key = KeyUtils.recoverPublicKey(publkey_fname);
//			priv_key = KeyUtils.recoverPrivateKey(privkey_fname);
//			Util.dusterize(tests_path+"bob-esponja.jpg", priv_key);
//			// Hay que volver a dejar la imagen dedusterizada
//			Util.deDusterize(tests_path+"bob-esponja.jpg.dust", tests_path, pub_key);
//		}catch(Exception e){
//			fail("Error al dusterizar");
//		}
//		
//		// Caso incorrecto, el fichero no existe
//		try{
//			PrivateKey priv_key;
//			
//			priv_key = KeyUtils.recoverPrivateKey(privkey_fname);
//			Util.dusterize(tests_path+"I'mcharginmahlazeeerrr!!.omg", priv_key);
//			fail("Error al desdusterizar");
//		}catch(Exception e){
//			;
//		}
//	}
//	
//	@Test
//	public void testDeDusterize() {
//		// Caso correcto
//		try{
//			PublicKey pub_key;
//			
//			pub_key = KeyUtils.recoverPublicKey(publkey_fname);
//			Util.deDusterize(tests_path+"bob-esponja.jpg.dust",tests_path, pub_key);
//		}catch(Exception e){
//			fail("Error al desdusterizar");
//		}
//		
//		// Caso incorrecto, el fichero no existe
//		try{
//			PublicKey pub_key;
//			
//			pub_key = KeyUtils.recoverPublicKey(publkey_fname);
//			Util.deDusterize(tests_path+"I'mcharginmahlazeeerrr!!.omg", tests_path+"I'mcharginmahlazeeerrr!!.omg", pub_key);
//			fail("Error al desdusterizar");
//		}catch(Exception e){
//			;
//		}
//	}
//	
//	@Test
//	public void testRecoverSign() {
//		// Caso correcto
//		try{
//			Publisher publisher = new Publisher("publicador");
//			publisher.importPrivate(privkey_fname, "");
//			publisher.importPublicKey(publkey_fname);
//			Util.recoverSign(tests_path+"bob-esponja.jpg.dust");
//		}catch(Exception e){
//			fail("Error al recuperar firma");
//		}
//		
//		// Caso incorrecto, el fichero no existe
//		try{
//			Publisher publisher = new Publisher("publicador");
//			publisher.importPrivate(privkey_fname, "");
//			publisher.importPublicKey(publkey_fname);
//			Util.recoverSign(tests_path+"I'mcharginmahlazeeerrr!!.omg");
//			fail("Error al desdusterizar");
//		}catch(Exception e){
//			;
//		}
//	}
//	
//	@Test
//	public void testCheckDirectoryPath() {
//		// Caso correcto
////		 * - Si se pasa "/tmp" se devuelve "/tmp/"
////		 * - Si se pasa "tmp" se devuelve "tmp/"
////		 * - Si se pasa "/tmp/" se devuelve "/tmp/"
////		 * - Si se pasa "tmp/" se devuelve "tmp/"
//		try{
//			if(!(Util.checkDirectoryPath("/tmp").contentEquals("/tmp/"))){
//				fail("Error en checkdirectorypath");
//			};
//			if(!(Util.checkDirectoryPath("tmp").contentEquals("tmp/"))){
//				fail("Error en checkdirectorypath");
//			};
//			if(!(Util.checkDirectoryPath("/tmp/").contentEquals("/tmp/"))){
//				fail("Error en checkdirectorypath");
//			};
//			if(!(Util.checkDirectoryPath("tmp/").contentEquals("tmp/"))){
//				fail("Error en checkdirectorypath");
//			};
//		}catch(Exception e){
//			fail("Error al recuperar firma");
//		}
//	}
//	
//	@Test
//	public void testFilterTitle() {
//		// Caso correcto
//		try{
//			// u#}'[,)._z62V"7{#3S	CORRECTA
//			// u#}<'[,)\"\\._z6/2V>7:{#3*?S	MALFORMADA	
//			String malformada = "u#}<'[,)\"\\._z6/2V>7:{#3*?S";
//			String correcta = "u#}'[,)\\._z62V7{#3S";
//			assertArrayEquals(Util.filterTitle(malformada).getBytes(), correcta.getBytes());
//		}catch(Exception e){
//			fail("Error al filtrar titulo");
//		}
//	}
//	
//	@Test
//	public void testGetPublishers() {
//		// Caso correcto
//		try{
//			Publisher publisher; 
//			publisher = new Publisher("publisher1");
//			publisher.importPrivate(privkey_fname, "");
//			publisher.importPublicKey(publkey_fname);
//			publisher.save(publishers_path);
//			
//			publisher = new Publisher("publisher2");
//			publisher.importPrivate(privkey_fname, "");
//			publisher.importPublicKey(publkey_fname);
//			publisher.save(publishers_path);
//			
//			publisher = new Publisher("publisher3");
//			publisher.importPrivate(privkey_fname,"");
//			publisher.importPublicKey(publkey_fname);
//			publisher.save(publishers_path);
//			
//			List<Publisher> publishers = Util.getPublishers(publishers_path);
//			assertEquals(publishers.size(), 3);
//		}catch(Exception e){
//			fail("Error al recuperar publishers .pub");
//		}
//		
//		// Caso erroneo
//		try{
//			Publisher publisher; 
//			publisher = new Publisher("publisher1");
//			publisher.importPrivate(privkey_fname, "");
//			publisher.importPublicKey(publkey_fname);
//			publisher.save(publishers_path);
//			
//			publisher = new Publisher("publisher2");
//			publisher.importPrivate(privkey_fname, "");
//			publisher.importPublicKey(publkey_fname);
//			publisher.save(publishers_path);
//			
//			publisher = new Publisher("publisher3");
//			publisher.importPrivate(privkey_fname,"");
//			publisher.importPublicKey(publkey_fname);
//			publisher.save(publishers_path);
//			
//			List<Publisher> publishers = Util.getPublishers(publishers_path);
//			if(publishers.size() == 666){
//				fail("testGetPublishers() deberia haber levantado una excepcion");	
//			}
//		}catch(Exception e){
//			;
//		}
//	}
//	
//	@Test
//	public void testGetBlogs() {
//		// Caso correcto
//		try{
//			List<Blog> blogs = Util.getBlogs("tests_util/");
//			assertEquals(1, blogs.size());
//		}catch(Exception e){
//			fail("Error al recuperar publishers .pub");
//		}
//		
//		// Caso incorrecto
//		try{
//			List<Blog> blogs = Util.getBlogs("tests_util/");
//			if(blogs.size() == 101) {
//				fail("testGetBlogs() deberia haber levantado una excepcion");	
//			}
//		}catch(Exception e){
//			;
//		}
//	}
//	
//	// FUNCTION IS OBSOLETE: To be removed.
////	@Test
////	public void testGetBlogsByPublicKey() 
////	throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, IOException {
////		PublicKey pub_key;
////		
////		pub_key = KeyUtils.recoverPublicKey(publkey_fname);
////		// Caso correcto
////		try{
////			List<Blog> blogs = Util.getBlogsByPublicKey(publishers_path, pub_key);
////			assertEquals(2, blogs.size());
////		}catch(Exception e){
////			fail("Error al recuperar blogs por publisher");
////		}
////		
////		// Caso incorrecto
////		try{
////			List<Blog> blogs = Util.getBlogsByPublicKey(publishers_path, pub_key);
////			if(blogs.size() == 101) {
////				fail("testGetBlogsByPublisher() deberia haber levantado una excepcion");	
////			}
////		}catch(Exception e){
////			;
////		}
////	}
//	
//	@Test
//	public void testBuildBlogDirTreeFromFile() {
//		final String tests_dir = "tests_util/tests_buildDirTree/";
//		final String zip_fname = tests_dir + "Un_informático_en_el_lado_del_mal-20110223150000000-n6fabec5429adb68a650355e8a0175552.zip";
//		final String xml_fname = tests_dir + "Un_informático_en_el_lado_del_mal-20110228140700000-fa156a58fd989bf332ad6aabc07ab8da.xml"; 
//		final String dir_output = tests_dir + "outputzip/";
//		File fd_output;
//		
//		// Caso correcto con un fichero zip.
//		try {
//			fd_output = new File(dir_output);
//			fd_output.mkdir();
//			Util.buildDirTreeFromFile(zip_fname, dir_output);
//			if (!deleteFile(dir_output))
//				throw new Exception("Problemas borrando " + dir_output);
//		}
//		catch (Exception e) {
//			e.printStackTrace();
//			fail("Exception thrown during unzipFile() tests.");
//		}
//		
//		// Caso correcto con un fichero xml.
//		try {
//			fd_output = new File(dir_output);
//			fd_output.mkdir();
//			Util.buildDirTreeFromFile(xml_fname, dir_output);
//			if (!deleteFile(dir_output))
//				throw new Exception("Problemas borrando " + dir_output);
//		}
//		catch (Exception e) {
//			e.printStackTrace();
//			fail("Exception thrown during unzipFile() tests.");
//		}
//	}
//	
//	// FUNCTION IS OBSOLETE: To be removed.
////	@Test
////	public void testRecoverDownloadedBlogFromPath() {
////		// Caso correcto
////		try {
////			List<Blog> blogs = Util.recoverDownloadedBlogFromPath(tests_recover_path);
////			assertEquals(blogs.size(), 3);
////		}catch(Exception e){
////			fail("Fallo en testRecoverDownloadedBlogFromPath");
////		}
////		// Caso incorrecto
////		try{
////			List<Blog> blogs = Util.recoverDownloadedBlogFromPath(tests_recover_path);
////			if(blogs.size() == 101) {
////				fail("testRecoverDownloadedBlogFromPath() deberia haber levantado una excepcion");	
////			}
////		}catch(Exception e){
////			;
////		}
////	}
//	
//	// OBSOLETE
////	@Test
////	public void testCheckDustFileAlreadyExist() {
////		// Caso correcto, buscamos un post deszippeado
////		try {
////			String fname = "BLOG2-20110128124726881-5f744ba5cd58442fb1d2ba46a4dd32f0c611c618.xml.dust";
////			boolean result = Util.checkDustFileAlreadyExist(tests_recover_path, fname);
////			if (result == false) {
////				fail("Fallo en testCheckDustFileAlreadyExist() con un post deszippeado");
////			}
////		}catch(Exception e){
////			fail("Fallo en testCheckDustFileAlreadyExist() con un post deszippeado");
////		}
////		
////		// Caso correcto, buscamos un post en ZIP
////		try {
////			String fname = "BLOG1-20110128124726881-5f744ba5cd58442fb1d2ba46a4dd32f0c611c618.zip.dust";
////			boolean result = Util.checkDustFileAlreadyExist(tests_recover_path, fname);
////			if (result == false) {
////				fail("Fallo en testCheckDustFileAlreadyExist() con un post zippeado");
////			}
////		}catch(Exception e){
////			fail("Fallo en testCheckDustFileAlreadyExist() con un post zippeado");
////		}
////		
////		// Caso incorrecto, buscamos un post deszippeado que no existe
////		try {
////			String fname = "BLOG2-20110128124726881-5f744ba5cd58442fb1d2ba46a4dd3NOEXISTE2f0c611c618.xml.dust";
////			boolean result = Util.checkDustFileAlreadyExist(tests_recover_path, fname);
////			if (result == true) {
////				fail("Fallo en testCheckDustFileAlreadyExist() con un post deszippeado");
////			}
////		}catch(Exception e){
////			;
////		}
////		
////		// Caso incorrecto, buscamos un post en ZIP que no existe
////		try {
////			String fname = "BLOG1-20110128124726881-5f744ba5cd58442fb1d2ba46a4dNOEXISTEd32f0c611c618.zip.dust";
////			boolean result = Util.checkDustFileAlreadyExist(tests_recover_path, fname);
////			if (result == true) {
////				fail("Fallo en testCheckDustFileAlreadyExist() con un post deszippeado");
////			}
////		}catch(Exception e){
////			;
////		}
////	}
//	
//	// OBSOLETE
////	@Test
////	public void testCheckImgDustFileAlreadyExist() {
////		// Caso correcto, buscamos una imagen que existe
////		try {
////			String dust_file = "BLOG2-20110128124726881-5f744ba5cd58442fb1d2ba46a4dd32f0c611c618.xml.dust";
////			String fname = "73b39d348c2bc0a69c307ebe52225cd2bc5e8afe.jpeg.dust";
////			boolean result = Util.checkImgDustFileAlreadyExist(tests_recover_path, dust_file, fname);
////			if (result == false) {
////				fail("Fallo en testCheckImgDustFileAlreadyExist() con una imagen");
////			}
////		}catch(Exception e){
////			fail("Fallo en testCheckImgDustFileAlreadyExist() con una imagen");
////		}
////		
////		// Caso incorrecto, buscamos una imagen que no existe
////		try {
////			String dust_file = "BLOG2-20110128124726881-5f744ba5cd58442fb1d2ba46a4dd32f0c611c618.xml.dust";
////			String fname = "73b39d348c2bc0a69c307ebe52225cd2NOEXISTEbc5e8afe.jpeg.dust";
////			boolean result = Util.checkImgDustFileAlreadyExist(tests_recover_path, dust_file, fname);
////			if (result != false) {
////				fail("Fallo en testCheckImgDustFileAlreadyExist() con una imagen");
////			}
////		}catch(Exception e){
////			;
////		}
////	}
//	
//	@Test
//	public void testIsFeed() throws FileNotFoundException {
//		// Correct case, the file is a feed.
//		String fname = "tests_util/rss2sample.xml";
//		if (!Util.isFeed(fname))
//			fail("Fail isFeed(), it said file is not a feed and it is.");
//		
//		// Correct case, file doesn't exists.
//		fname = "thisfiledoesntexists";
//		try {
//			Util.isFeed(fname);
//			fail("Fail isFeed(), FileNotFoundException must be thrown.");
//		}
//		catch (FileNotFoundException e) {}
//		
//		// Correct case, file isn't a feed.
//		fname = "tests_util/test_recoverdatafrominputstream.txt";
//		if (Util.isFeed(fname))
//			fail("Fail isFeed(), it said file is a feed and it isn't.");
//	}
}
